/*File Name		: Calendar.cpp*/
/*Date			: 11-11-2012 */
/*Maker Name	: Jonathan Ery Pradana / 23512038 ; M.Ghufron Mahfudhi / 23512066*/
/* Definisi Class Calendar */

#include "Calendar.h"

/** 4 sekawan **/
Calendar::Calendar()
/* Constructor: membuat kalender default */
{
	this->Name = "Calendar";
}

Calendar::Calendar(string newName, list<Event> newList)
/* Constructor: membuat kalender dengan parameter yang terdefinisi */
{
	this->Name = newName;
	this->EventList = newList;
}

Calendar::Calendar(const Calendar& C)
/* Copy constructor: membuat kalender dari kalender yang sudah ada */
{
	this->Name = C.Name;
	this->EventList = C.EventList;
}

Calendar& Calendar::operator=(const Calendar& C)
/* Overload operator = */
{
	if (this->EventList.size() > 0){
		this->EventList.clear();
	}
	this->Name = C.Name;
	this->EventList = C.EventList;
}

Calendar::~Calendar()
/* Destructor */
{
	this->EventList.clear();
}

/** Getter & Setter **/
string Calendar::GetName()
/* Mengembalikan Name kalender */
{
	return this->Name;
}

list<Event> Calendar::GetEventList()
/* Mengembalikan daftar event dalam kalender */
{
	return this->EventList;
}

void Calendar::SetName(const string& newName)
/* Mengubah Nama kalender sesuai parameter */
{
	this->Name = newName;
}

void Calendar::SetEventList(const list<Event>& newList)
/* Mengubah event dalam kalender dengan event parameter */
{
	this->EventList = newList;
}
		
/** Method **/
void Calendar::AddEvent(Event E)
/* Proses: menambahkan E dalam Calendar */
/* I.S. EventList mungkin kosong */
/* F.S. E ditambahkan ke dalam EventList */
{	
	this->EventList.push_front(E);
}

void Calendar::DelEvent(int entryNo)
/* Proses: Menghapus Event dengan nomor entryNo */
/* I.S. Calendar tidak mungkin kosong */
/* F.S. Event dengan eNum=entryNo terhapus */
{
	list<Event>::iterator it, end;
	
	it = this->EventList.begin();
	while((it != this->EventList.end()) && it->GetNum() != entryNo)
	{
		it++;
	}
	if (it != this->EventList.end() && it->GetNum() == entryNo){
		this->EventList.erase(it);
	}else{
		cout << "Tidak menemukan Event dengan nomor: " << entryNo << endl;
	}
}

void Calendar::ViewEvent(int eventId)
/* Proses : Menampilkan event dengan nomor sesuai parameter */
/* I.S. Calender tidak mungkin kosong*/
/* F.S. Event dengan nomor eventId tampil di layar*/
{
	list<Event>::iterator it;
	
	it = this->EventList.begin();
	while((it != this->EventList.end()) && it->GetNum() != eventId)
	{
		it++;
	}
	if (it != this->EventList.end() && it->GetNum() == eventId){
		cout << "Menampilkan Event dengan nomor " << eventId << " dalam kalender " << GetName();
		it->TulisEvent();
	}else{
		cout << "Tidak menemukan Event dengan nomor: " << eventId << endl;
	}
}

void Calendar::ViewCal()
/* Proses: Menampilkan semua event di dalam C */
/* I.S. C mungkin kosong */
/* F.S. Semua event tampil di layar dalam bentuk list of event */
{
	if(GetEventList().size() > 0){
		for(list<Event>::reverse_iterator it = this->GetEventList().rbegin(), itEnd = this->GetEventList().rend(); it!= itEnd; ++it){
			cout<<"ID No.: "<< it->GetNum();
			cout<<", Event: "<< it->GetName();
			cout<<", Time: ";
			it->GetTime().Print();
			cout<<endl;
		}
	}else{
		cout<<"Calendar is Empty"<<endl;
	}
}

void Calendar::SortCal()
/* Proses: Menyortir List Event dalam kalender berdasarkan waktunya */
/* I.S. Calendar mungkin kosong */
/* F.S. List Event dalam Calendar terurut berdasarkan waktu */
{
	this->EventList.sort();
}

void Calendar::DeleteCal()
/* Proses: Menghapus semua Event dalam Calendar */
/* I.S. Calendar mungkin kosong */
/* F.S. Semua Event dalam Calendar terhapus */
{
	this->EventList.clear();
}

/** Override Method **/
void Calendar::ReadFile(string NamaFile){
	//Kamus
	string line,temp;
	int NCal;
	
	//Algoritma
	
	//menghapus list jika sudah ada (akan menimpa kalender yang sudah ada)
	if (this->EventList.size() > 0){
		this->EventList.clear();
	}
	
	ifstream myfile (NamaFile.c_str());
	if (myfile.is_open()){
		//pasang nama file
		getline(myfile,line);
		SetName(line);
		
		//pasang banyak event
		getline(myfile,line);
		stringstream ss(line);
		ss >> NCal;
		
		//iterasi setiap event
		for(int i = 0; (i < NCal) && myfile.good(); i++){			
			//membuat nomor event
			getline(myfile, line);
			stringstream ssNum(line);
			int newNum;
			ssNum >> newNum;
			
			//membuat nama event
			getline(myfile, line);
			string newName = line;
			
			//membuat tempat event
			getline(myfile, line);
			Point newVenue(line);
			
			//membuat waktu event
			getline(myfile, line);
			DateTime newDT(line);
			
			//membuat peserta event
			getline(myfile, line);
			ListOfName newLNames(line);
			
			//membuat event dan memasukkan ke vector
			AddEvent(Event(newNum, newName, newVenue, newDT, newLNames));
		}
		if (myfile.good()){
			getline(myfile,temp);
		}
		
		myfile.close();
	} else{
		cout << "Tidak bisa membuka file." << endl;
	}
}

void Calendar::SaveFile(string NamaFile)
/* Proses : Menuliskan elemen-elemen Calendar ke dalam File NamaFile */
/* I.S	: NamaFile terdefinisi, Calendar berisi event yang akan dituliskan ke file */
/* F.S	: File yang bernama NamaFile terbentuk, dan berisi elemen Calendar */
{
	ofstream myfile (NamaFile.c_str());
	if (myfile.is_open())
	{
		//menulis nama kalender
		myfile << GetName() << endl;
		
		//menulis jumlah event
		myfile << this->EventList.size() << endl;
		
		//menulis semua event
		if(this->EventList.size() > 0){
			for(list<Event>::iterator it = this->EventList.begin(); it!=this->EventList.end(); it++){
				//menulis nomor event
				myfile << it->GetNum() << endl;
				
				//menulis nama event
				myfile << it->GetName() << endl;
				
				//menulis tempat event
				myfile << it->GetVenue().ToString() << endl;
				
				//menulis waktu event
				myfile << it->GetTime().ToString() << endl;
				
				//menulis daftar nama event
				myfile << it->GetLNames().ToString() << endl;
			}
		}
		
		myfile.close();
	}
	else {
		cout << "Tidak bisa membuka file." << endl;
	}
}
